Go interface
私はJavaもやったことなく、Goが初の静的型言語
変数の宣言、代入、関数の引数、返り値、
プログラムの文(statement)な部分で、常にsignatureをチェックされる。
たぶん、これだとあまりにも不自由なので、
interfaceというのを定めて、このinterfaceを満たすもの、という型のチェックで通す
(内部、メモリ上はそうではないだろうが)
コンパイラーを通すための、ダックタイピング とイメージしておく。
満たせば通る。
but it took some practice before I knew how to design my own interfaces.
2 aspects:
a set of methods but it is also a type.
a type タイプ(型)なので、int, stringなどと同じように、関数の引数や返り値などの部品になる。
code: animal_interface.go
type Animal interface {
Speak() string
}
type Dog struct {}
func (d Dog) Speak() string{
return "Woof"
func (c Cat) Speak() string{
return "Meow"
}
Animalインターフェースを作って、そこには Spreak関数の定義をした。(型を定めた) Speakを持つ関数を作った。Animalインターフェースを満たす関数, Dog, Catを作った。
この Dog, Catは、Animalインターフェースを満たすので、
animals := []Animal{{Dog{}, Cat{}}
と1つのsliceにいれられた。sliceは、このインターフェースを使って、処理など?ができる。
Interfaceを満たす Satisfy the {Animal} interface.
一番緩やかなインターフェース
で、具体的にどういうのが、interfaceを満たすのか?が話の流れになるけど、
同じ関数を持つものになる。いくつ関数を持てばよいのかは、そのinterfaceに書かれてる分だけ。 下のように 0個でもよい。
type a interface{}
0個なら、あらゆるtypeが満たす(0個持ってる)ので、上のものは、どんな関数でも、aインターフェースは満たす。
コードをみてると、そういうのもちょくちょくある。ボトムアップで書いていって、どうしても制約を付けられないときはあるだろう。(静的型は本の勉強だけの感想)
参考
まだ、理解できてないけど、、流しては?読めた。